﻿#pragma once
#ifndef _CALIBRATION_H_
#define _CALIBRATION_H_

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include </usr/include/eigen3/Eigen/Dense>
#include <vector>
#include <fstream>

#define PICTURENUM 15




class calibration {


public:

	calibration();
	~calibration();
	/* 函数名：CalibrationPic
	 * @目的： 对采集到的图片进行标定，得到内外参矩阵，为类的成员变量，其他成员函数可以使用，还有角点的图像坐标和世界坐标系坐标也可以使用
	 * @参数：采集的图片的vector引用
	*/
	void CalibrationPic(std::vector<cv::Mat> & pictures , int picflag);
	/* 函数名：CorrectPic
	 * @目的： 对采集到的图片进行矫正
	 * @参数：需要矫正的原图
	 * @返回值：矫正好的图片
	*/
	cv::Mat CorrectPic(cv::Mat frame);

	/* 函数名：TableMap
	 * @目的： 对图像坐标进行映射，得到对应的世界坐标系坐标
	 * @参数：（Xc,Yc）图像坐标
	 * @返回值：（Xw,Yw）世界坐标
	*/
	cv::Point2d TableMap(float X, float Y, Eigen::MatrixXd hmatrix);

	/* 函数名：CalculateHmatrix
	 * @目的： 计算映射矩阵H
	 * @参数：求第几幅图像的H
	 * @返回值：H矩阵
	*/
	Eigen::MatrixXd CalculateHmatrix(int num, int picflag);

	/* 函数名：testResult
	 * @目的： 验算结果
	 * @参数：0 为验算原图像的映射误差 1 为验算矫正图像的映射误差
	 * @返回值：无
	*/
	void testResult(int picflag);

	/* 函数名：GetCorpictures
	 * @目的： 矫正输入的一组图片
	 * @参数：pictures 需要矫正的一组图片 corrpictures 矫正完的一组图片
	 * @返回值：无
	*/
	void GetCorpictures(std::vector<cv::Mat> & pictures, std::vector<cv::Mat> & corrpictures);//帮助得到矫正的图片

	void helper(std::vector<cv::Mat> & pictures);//帮助读取图片





private:

	std::vector<std::vector<cv::Point3f> > object_points;
	std::vector<std::vector<cv::Point2f> > image_points_seq;//保存检测到的所有角点

	double a1;
	double a2;
	double a3;
	double a4;
	double a5;
	double a6;
	cv::Mat Romatrix = cv::Mat(3, 3, CV_32FC1, cv::Scalar::all(0));//保存每幅图像的旋转矩阵

	int countnum = 0;

	std::string imageFileName;
	std::string filePath;
	std::stringstream StrStm;

	int croNum = 0;

};








#endif

